34 SCI 配置 SPI

开发板官网(https://www.edevkit.com/)
本系列教程目录:
- 瑞萨单片机开发教程[一] e2-studio + DAP LINK开发环境搭建
- 瑞萨单片机开发教程[二] Keil/RASC开发环境搭建
- 瑞萨单片机开发教程[三] 新建RASC工程
- 瑞萨单片机开发教程[四] GPIO输出——led实验
- 瑞萨单片机开发教程[五] GPIO输入——按键key实验
- 瑞萨单片机开发教程[六] ICU外部中断实验
- 瑞萨单片机开发教程[七] SCI UART串口通信实验
- 瑞萨单片机开发教程[八] DMAC 串口数据传输实验
- 瑞萨单片机开发教程[九] ADC 电压采集实验
SCI SPI 实验
本章目标:
- 了解 RA6M5 处理器的 SCI SPI 模块
- 学会使用 RASC 配置 SCI SPI,使用 API 读写数据。
硬件设计(略,参见配套硬件原理图)
软件设计
新建工程
复制一份 “07 SCI_UART_Recv_send” 修改文件夹名 “34 SCI_SPI”,双击打开 EBF_RA6M5.uvprojx 工程,通过 Keil 的新建文件新建 sci_spi.c 和 sci_spi.h 保存到目录下的 \src 文件夹下。
FSP 配置
Keil 界面选择 “Tools”→“RA Smart Configurator” 打开 RASC 界面。
在 “Pins” 添加 SCI 设备,配置成 Simple SPI 模式。

在 “Stack” 添加 SCI SPI Stack 模块。

配置 SCI SPI 模块参数。

配置完成之后可以按下快捷键“Ctrl + S”保存,最后点击 “Generate Project Content” 按钮,让软件自动生成配置代码即可。
程序设计
初始化 SCI SPI 模块,实现数据回环收发,需要把 SPI 的 MOSI 和 MISO 互接,SCI SPI 的 RXD0 对应 MISO,TXD0 对应 MOSI,测试接收的数据打印到串口。
- 打开 SCI SPI 设备
fsp_err_t R_SCI_SPI_Open(spi_ctrl_t * p_ctrl, spi_cfg_t const * const p_cfg);
- 直接写数据
fsp_err_t R_SCI_SPI_Write(spi_ctrl_t * const p_ctrl,
void const * p_src,
uint32_t const length,
spi_bit_width_t const bit_width);
- 直接读数据
fsp_err_t R_SCI_SPI_Read(spi_ctrl_t * const p_ctrl,
void * p_dest,
uint32_t const length,
spi_bit_width_t const bit_width);
- 读写数据
fsp_err_t R_SCI_SPI_WriteRead(spi_ctrl_t * const p_ctrl,
void const * p_src,
void * p_dest,
uint32_t const length,
spi_bit_width_t const bit_width);
程序编写
sci_spi.h 头文件定义初始化和读写函数。
#ifndef __BSP_SCI_SPI_H
#define __BSP_SCI_SPI_H
#include "hal_data.h"
void sci_spi_Init(void);
void SCI_SPI_WriteRead_data(uint8_t *wBuf, uint8_t *rBuf, uint16_t len);
#endif
sci_spi.c 中实现读写。
#include "sci_spi.h"
void sci_spi_Init(void)
{
R_SCI_SPI_Open(g_sci_spi2.p_ctrl, g_sci_spi2.p_cfg);
}
static volatile bool gSPITxCplt = false;
void sci_spi_callback(spi_callback_args_t *arg)
{
/* 判断是否是发送完成触发的中断 */
/* 如果是的话就将发送完成标志位置1 */
if(SPI_EVENT_TRANSFER_COMPLETE == arg->event)
gSPITxCplt = true;
}
static void SPIWaitTxCplt(void)
{
uint16_t wTimeout = 50;
while(!gSPITxCplt && wTimeout)
{
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
wTimeout--;
}
gSPITxCplt = false;
}
void SCI_SPI_WriteRead_data(uint8_t *wBuf, uint8_t *rBuf, uint16_t len)
{
R_SCI_SPI_WriteRead(g_sci_spi2.p_ctrl, wBuf, rBuf, len, SPI_BIT_WIDTH_8_BITS);
SPIWaitTxCplt();
}
在 hal_entry.c 文件中添加 sci_spi.h,循环中每秒读写数据。
uint8_t wBuf[10] = {0};
uint8_t rBuf[10] = {0};
void hal_entry(void)
{
/* TODO: add your own code here */
led_Init(); // LED 初始化
uart0_Init();
sci_spi_Init();
printf("start sci spi test\r\n");
for(uint8_t i=0; i<10; i++)
{
wBuf[i] = i;
}
while(1)
{
LED1_TOGGLE();
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒
SCI_SPI_WriteRead_data(wBuf, rBuf, 10);
printf("sci spi rx:");
for(int i=0; i<10; i++)
{
printf("%x ", rBuf[i]);
}
printf("\r\n");
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
下载验证
连接下载器,将程序编译并下载到开发板之后,按下复位按键来复位开发板,程序启动初始化完。
可以看到每秒接收数据值。
